package com.sky.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sky.constant.MessageConstant;
import com.sky.dto.UserLoginDTO;
import com.sky.entity.User;
import com.sky.exception.LoginFailedException;
import com.sky.mapper.UserMapper;
import com.sky.properties.WeChatProperties;
import com.sky.service.UserService;
import com.sky.utils.HttpClientUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

/**
 * 用户服务实现类，处理微信登录相关业务逻辑
 */
@Slf4j
@Service
public class UserServiceImpl implements UserService {
     /*
        微信登录业务
           1: 解析出来code授权码
             找腾讯 发送校验请求
             https://api.weixin.qq.com/sns/jscode2session
             带四个参数 appid  secret  js_code  grant_type
             怎么发  使用HttpClient 发  用工具类
           2:发完后得到响应字符串 一个json格式
            {
                "session_key": "iaXHXf06bvpUitGGDxCJqw==",
                "openid": "o1ybQ6rjMYEJa508hN_JzdZNjk08"
            }
            {
                "errcode": 40029,
                "errmsg": "invalid code, rid: 6506b4a9-3cda9998-64588c76"
            }
            解析json判断是不是有openid 如果没有说明登录校验失败 。
            3:校验成功 得到 openid
               根据openid 去数据库查询 用户信息
                3.1  null 数据库没有这个用户 这是一个新用户  做注册 insert
                3.2  不为null 有了 查询到的user里面有用户id和openid
            4:最终返回 user对象
     */

    @Autowired
    private WeChatProperties weChatProperties;

    @Autowired
    private UserMapper userMapper;

    /**
     * 实现微信授权登录功能
     *
     * @param userLoginDTO 包含微信授权码的数据传输对象
     * @return 登录成功的用户对象
     */
    @Override
    public User wxLogin(UserLoginDTO userLoginDTO) {
        // 1. 准备请求参数并发送获取 session 的请求
        Map<String, String> requestParams = new HashMap<>();
        requestParams.put("appid", weChatProperties.getAppid());
        requestParams.put("secret", weChatProperties.getSecret());
        requestParams.put("js_code", userLoginDTO.getCode());
        requestParams.put("grant_type", "authorization_code");

        String jsonResponse = HttpClientUtil.doGet("https://api.weixin.qq.com/sns/jscode2session", requestParams);

        // 2. 解析 JSON 响应数据
        JSONObject jsonObject = JSON.parseObject(jsonResponse);
        String openid = jsonObject.getString("openid");

        // 3. 校验是否成功获取到 openid
        if (openid == null) {
            log.error("微信登录失败：无效的授权码");
            throw new LoginFailedException(MessageConstant.LOGIN_FAILED);
        }

        // 4. 查询或注册用户
        User user = userMapper.getByOpenId(openid);

        // 5. 如果是新用户，则进行注册
        if (user == null) {
            user = new User();
            user.setOpenid(openid);
            user.setCreateTime(LocalDateTime.now());
            userMapper.insert(user);
        }

        // 6. 返回用户对象
        return user;
    }
}